﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace lista_uporzadkowana
{
    public class Element<D> 
    {
        private int klucz;
        private D dane;

        public Element(int k, D d)
        {
            klucz = k;
            dane = d;
        }

        public int zwrocKlucz() { return klucz; }
    }


    class Lista<D>
    {
        private Element<D>[] dane;
        private int pojemnosc;
        private int dlugosc;
        public int zwrocDlugosc()
        { return dlugosc; }
        public Lista()
        {
            Inicjalizuj();
        }
        public Lista(int i)
        {
            Inicjalizuj(i);
        }
        public void Inicjalizuj()
        {
            dane = new Element<D>[1000];//samo ogólne stworzenie bez wprowadzenia elementów do listy
            pojemnosc = 1000;
            dlugosc = 0;
        }
        public void Inicjalizuj(int i)
        {
            dane = new Element<D>[i];
            pojemnosc = i;
            dlugosc = 0;
        }

        public void Wyswietl() //do testu
        {

            for (int i = 0; i < dlugosc; i++)
            {
                Console.WriteLine("Lista to:" + dane[i].zwrocKlucz());
            }
        }
        public void Wstaw(int klucz, D d)
        {
            dlugosc++;
            Element<D> nowy = new Element<D>(klucz, d);
            if (dlugosc == pojemnosc) // ewentualne zwiekszanie pojemnosci
            {
                Element<D>[] temp = new Element<D>[2 * pojemnosc];
                for (int i = 0; i < dlugosc; i++)
                    temp[i] = dane[i];
                dane = temp;
                pojemnosc *= 2;
            }
            if (dlugosc == 1)
            {
                dane[0] = nowy;
                return;
            }

            for (int i = 0; i < dlugosc; i++)
            {

                if (i < dlugosc - 1)
                {


                    if (dane[i].zwrocKlucz() > nowy.zwrocKlucz())//przestawienie znaku zmienia naszą liste na rosnącą lub malejącą
                    {
                        Element<D> temp = new Element<D>(klucz, d);
                        temp = dane[i];
                        dane[i] = nowy;
                        nowy = temp;
                    }

                }
                else
                    dane[dlugosc - 1] = nowy;
            }
        }
        public Element<D> Usun()
        {
            Element<D> a = dane[dlugosc - 1];
            dlugosc--;
            return a;
        }
    }
               
    class Program
    {
        static void Main(string[] args)
        {
            Lista<int> lista = new Lista<int>();
            lista.Wstaw(10, 2);
            lista.Wstaw(75, 1);
            lista.Wstaw(23, 5);
            lista.Wstaw(1, 4);
            lista.Wstaw(23, 5);
            lista.Wstaw(15, 5);
            lista.Wstaw(76, 5);
            lista.Wstaw(45, 4);
            lista.Wstaw(10, 3);
            //lista.Wstaw(8, 'e');
            //lista.Wstaw(234, 'r');
            lista.Wyswietl();
            Console.ReadLine();
       }
    }
}
